home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 32 / Mac Magazin and MacEasy Magazine CD - Issue 32.iso / Grafik & Text / OzTeX3.0 / Metafont / Inputs / cm / line.mf < prev    next >
Text File  |  1996-03-25  |  9KB  |  553 lines

  1. qqs:=ceiling(qqs#*hppp); % the way rule widths are calculated
  2. define_pixels(qqh,qqw,arrowlen,arrowht,arrowcurve);
  3.  
  4. def line (expr delx, dely) =
  5. numeric qht,qwd,absdely;
  6.  
  7. if dely > 0:
  8.       if delx > dely: qwd# := qqw#; qht# := dely*qqw#/delx;
  9.               else: qht# := qqw#; qwd# := delx*qqw#/dely;    fi;
  10.       beginchar( 8(delx-1)+(dely-1),qwd#,qht#,0pt#);
  11.       x0=0; y0=0;
  12.       x1=w; y1=h;
  13.   else:
  14.       absdely=-dely;
  15.       if delx > absdely: qwd# := qqw#; qht# := absdely*qqw#/delx;
  16.               else: qht# := qqw#; qwd# := delx*qqw#/absdely;    fi;
  17.       beginchar(64+8(delx-1)+(absdely-1),qwd#,qht#,0pt#);
  18.       x0=0; y0=h;
  19.       x1=w; y1=0;
  20. fi;
  21. pickup pencircle scaled qqs;
  22. draw z0..z1
  23. enddef;
  24.  
  25. def larrow (expr char, delx, dely) =
  26. numeric rxa,rxb,rxc,rxd,rxe,rya,ryb,ryc,ryd,rye;
  27. numeric qht,qwd,absdely;
  28. if dely > 0:
  29.       if delx > dely: qwd# := qqw#; qht# := dely*qqw#/delx;
  30.               else: qht# := qqw#; qwd# := delx*qqw#/dely;    fi;
  31.    % fixed by DEK on 24 Jan 89; previous code buggy but caused no harm
  32.   else:
  33.       absdely=-dely;
  34.       if delx > absdely: qwd# := qqw#; qht# := absdely*qqw#/delx;
  35.               else: qht# := qqw#; qwd# := delx*qqw#/absdely;    fi;
  36. fi;
  37.  
  38. beginchar(char,qwd#,qht#,0pt#);
  39. if dely > 0: y0=0; else: y0=h; fi;
  40.  
  41. x0=0;
  42. rxa=arrowlen; rya=0;
  43. rxb=arrowlen; ryb=arrowht;
  44. rxc=arrowlen; ryc=-arrowht;
  45. rxd=.5rxa; ryd=.5ryb-arrowcurve;
  46. rxe=rxd; rye=-ryd;
  47.  
  48. numeric rlen;
  49. rlen = sqrt(delx*delx + dely*dely);
  50.  
  51. x1=(rxa*delx - rya*dely)/rlen;
  52. y1=(rxa*dely+rya*delx)/rlen + y0;
  53.  
  54. %x2=rxb; y2=ryb;
  55. x2=(rxb*delx - ryb*dely)/rlen;
  56. y2=(rxb*dely+ryb*delx)/rlen + y0;
  57.  
  58. %x3=rxc; y3=ryc;
  59. x3=(rxc*delx - ryc*dely)/rlen;
  60. y3=(rxc*dely+ryc*delx)/rlen + y0;
  61.  
  62. %x4=rxd; y4=ryd;
  63. x4=(rxd*delx - ryd*dely)/rlen;
  64. y4=(rxd*dely+ryd*delx)/rlen + y0;
  65.  
  66. %x5=rxe; y5=rye;
  67. x5=(rxe*delx - rye*dely)/rlen;
  68. y5=(rxe*dely+rye*delx)/rlen + y0;
  69.  
  70. fill z0..z5..z3--z1--z2..z4..z0--cycle
  71. enddef;
  72.  
  73. def rarrow (expr char, delx, dely) =
  74.  
  75. numeric rxa,rxb,rxc,rxd,rxe,rya,ryb,ryc,ryd,rye;
  76. numeric qht,qwd,absdely;
  77. if dely > 0:
  78.       if delx > dely: qwd# := qqw#; qht# := dely*qqw#/delx;
  79.               else: qht# := qqw#; qwd# := delx*qqw#/dely;    fi;
  80.   else:
  81.       absdely=-dely;
  82.       if delx > absdely: qwd# := qqw#; qht# := absdely*qqw#/delx;
  83.               else: qht# := qqw#; qwd# := delx*qqw#/absdely;    fi;
  84. fi;
  85.  
  86. beginchar(char,qwd#,qht#,0pt#);
  87.  
  88. if dely > 0: y0=h; else: y0=0; fi;
  89.  
  90. x0=w;
  91. rxa=-arrowlen; rya=0;
  92. rxb=rxa; ryb=arrowht;
  93. rxc=rxa; ryc=-arrowht;
  94. rxd=.5rxa; ryd=.5ryb-arrowcurve;
  95. rxe=rxd; rye=-ryd;
  96.  
  97. numeric rlen;
  98. rlen = sqrt(delx*delx + dely*dely);
  99.  
  100. %x1= rxa;y1=rya;   %%%% replace the following by rotations
  101. x1=(rxa*delx - rya*dely)/rlen + x0;
  102. y1=(rxa*dely+rya*delx)/rlen + y0;
  103.  
  104. %x2=rxb; y2=ryb;
  105. x2=(rxb*delx - ryb*dely)/rlen + x0;
  106. y2=(rxb*dely+ryb*delx)/rlen + y0;
  107.  
  108. %x3=rxc; y3=ryc;
  109. x3=(rxc*delx - ryc*dely)/rlen + x0;
  110. y3=(rxc*dely+ryc*delx)/rlen + y0;
  111.  
  112. %x4=rxd; y4=ryd;
  113. x4=(rxd*delx - ryd*dely)/rlen + x0;
  114. y4=(rxd*dely+ryd*delx)/rlen + y0;
  115.  
  116. %x5=rxe; y5=rye;
  117. x5=(rxe*delx - rye*dely)/rlen + x0;
  118. y5=(rxe*dely+rye*delx)/rlen + y0;
  119.  
  120. fill z0..z5..z3--z1--z2..z4..z0--cycle
  121. enddef;
  122.  
  123. % character code rules, for
  124. %    line(x,y):
  125. %         0 < x,y <= 6     :  8*(x-1) +  (y-1)
  126. %
  127. %    larrow(x,y):
  128. %         0 < x,y <= 4     : 8*(2x-1) + (2y-1)
  129. %         y=0              : '33
  130. %    rarrow(x,y):
  131. %         0 < x,y < 3      : 8*(3x-1) + (3y-1)
  132. %         0 < x <= 4, y=3  : 8*(2x-1) +      6
  133. %         0 < x < 4, y = 4 :   8*(2x) +      7
  134. %         x=3, 0 < y <=4   :      8*6 + (2y-1)
  135. %         x = 4, 0 < y < 4 :      8*7 +     2y
  136. %         y=0              : 55
  137. %
  138. %   for y < 0: value is 64 + value for (x, |y|)
  139. %
  140. %   up arrow: '66   down arrow: '77
  141.  
  142. fontdimen 1: 0,0,0,0,0,0,0,qqs#; % line thickness in points
  143. let cmchar=\; % cmchar should precede each character, for testing purposes
  144.  
  145.  
  146. font_coding_scheme:= "LaTeX line";
  147.  
  148. cmchar "Character '00";
  149. line(1,1);
  150. endchar;
  151.  
  152. cmchar "Character '11";
  153. larrow(9,1,1);
  154. endchar;
  155.  
  156. cmchar "Character '22";
  157. rarrow(18,1,1);
  158. endchar;
  159.  
  160. cmchar "Character '01";
  161. line(1,2);
  162. endchar;
  163.  
  164. cmchar "Character '13";
  165. larrow(11,1,2);
  166. endchar;
  167.  
  168. cmchar "Character '25";
  169. rarrow(21,1,2);
  170. endchar;
  171.  
  172. cmchar "Character '02";
  173. line(1,3);
  174. endchar;
  175.  
  176. cmchar "Character '15";
  177. larrow(13,1,3);
  178. endchar;
  179.  
  180. cmchar "Character '16";
  181. rarrow(14,1,3);
  182. endchar;
  183.  
  184. cmchar "Character '03";
  185. line(1,4);
  186. endchar;
  187.  
  188. cmchar "Character '17";
  189. larrow(15,1,4);
  190. endchar;
  191.  
  192. cmchar "Character '27";
  193. rarrow(23,1,4);
  194. endchar;
  195.  
  196. cmchar "Character '04";
  197. line(1,5);
  198. endchar;
  199.  
  200. cmchar "Character '05";
  201. line(1,6);
  202. endchar;
  203.  
  204. cmchar "Character '10";
  205. line(2,1);
  206. endchar;
  207.  
  208. cmchar "Character '31";
  209. larrow(25,2,1);
  210. endchar;
  211.  
  212. cmchar "Character '52";
  213. rarrow(42,2,1);
  214. endchar;
  215.  
  216. cmchar "Character '12";
  217. line(2,3);
  218. endchar;
  219.  
  220. cmchar "Character '35";
  221. larrow(29,2,3);
  222. endchar;
  223.  
  224. cmchar "Character '36";
  225. rarrow(30,2,3);
  226. endchar;
  227.  
  228. cmchar "Character '14";
  229. line(2,5);
  230. endchar;
  231.  
  232. cmchar "Character '20";
  233. line(3,1);
  234. endchar;
  235.  
  236. cmchar "Character '51";
  237. larrow(41,3,1);
  238. endchar;
  239.  
  240. cmchar "Character '61";
  241. rarrow(49,3,1);
  242. endchar;
  243.  
  244. cmchar "Character '21";
  245. line(3,2);
  246. endchar;
  247.  
  248. cmchar "Character '53";
  249. larrow(43,3,2);
  250. endchar;
  251.  
  252. cmchar "Character '63";
  253. rarrow(51,3,2);
  254. endchar;
  255.  
  256. cmchar "Character '23";
  257. line(3,4);
  258. endchar;
  259.  
  260. cmchar "Character '57";
  261. larrow(47,3,4);
  262. endchar;
  263.  
  264. cmchar "Character '67";
  265. rarrow(55,3,4);
  266. endchar;
  267.  
  268. cmchar "Character '24";
  269. line(3,5);
  270. endchar;
  271.  
  272. cmchar "Character '30";
  273. line(4,1);
  274. endchar;
  275.  
  276. cmchar "Character '71";
  277. larrow(57,4,1);
  278. endchar;
  279.  
  280. cmchar "Character '72";
  281. rarrow(58,4,1);
  282. endchar;
  283.  
  284. cmchar "Character '32";
  285. line(4,3);
  286. endchar;
  287.  
  288. cmchar "Character '75";
  289. larrow(61,4,3);
  290. endchar;
  291.  
  292. cmchar "Character '76";
  293. rarrow(62,4,3);
  294. endchar;
  295.  
  296. cmchar "Character '34";
  297. line(4,5);
  298. endchar;
  299.  
  300. cmchar "Character '40";
  301. line(5,1);
  302. endchar;
  303.  
  304. cmchar "Character '41";
  305. line(5,2);
  306. endchar;
  307.  
  308. cmchar "Character '42";
  309. line(5,3);
  310. endchar;
  311.  
  312. cmchar "Character '43";
  313. line(5,4);
  314. endchar;
  315.  
  316. cmchar "Character '45";
  317. line(5,6);
  318. endchar;
  319.  
  320. cmchar "Character '50";
  321. line(6,1);
  322. endchar;
  323.  
  324. cmchar "Character '54";
  325. line(6,5);
  326. endchar;
  327.  
  328. cmchar "Character '100";
  329. line(1,-1);
  330. endchar;
  331.  
  332. cmchar "Character '111";
  333. larrow(73,1,-1);
  334. endchar;
  335.  
  336. cmchar "Character '122";
  337. rarrow(82,1,-1);
  338. endchar;
  339.  
  340. cmchar "Character '101";
  341. line(1,-2);
  342. endchar;
  343.  
  344. cmchar "Character '113";
  345. larrow(75,1,-2);
  346. endchar;
  347.  
  348. cmchar "Character '125";
  349. rarrow(85,1,-2);
  350. endchar;
  351.  
  352. cmchar "Character '102";
  353. line(1,-3);
  354. endchar;
  355.  
  356. cmchar "Character '115";
  357. larrow(77,1,-3);
  358. endchar;
  359.  
  360. cmchar "Character '116";
  361. rarrow(78,1,-3);
  362. endchar;
  363.  
  364. cmchar "Character '103";
  365. line(1,-4);
  366. endchar;
  367.  
  368. cmchar "Character '117";
  369. larrow(79,1,-4);
  370. endchar;
  371.  
  372. cmchar "Character '127";
  373. rarrow(87,1,-4);
  374. endchar;
  375.  
  376. cmchar "Character '104";
  377. line(1,-5);
  378. endchar;
  379.  
  380. cmchar "Character '105";
  381. line(1,-6);
  382. endchar;
  383.  
  384. cmchar "Character '110";
  385. line(2,-1);
  386. endchar;
  387.  
  388. cmchar "Character '131";
  389. larrow(89,2,-1);
  390. endchar;
  391.  
  392. cmchar "Character '152";
  393. rarrow(106,2,-1);
  394. endchar;
  395.  
  396. cmchar "Character '112";
  397. line(2,-3);
  398. endchar;
  399.  
  400. cmchar "Character '135";
  401. larrow(93,2,-3);
  402. endchar;
  403.  
  404. cmchar "Character '136";
  405. rarrow(94,2,-3);
  406. endchar;
  407.  
  408. cmchar "Character '114";
  409. line(2,-5);
  410. endchar;
  411.  
  412. cmchar "Character '120";
  413. line(3,-1);
  414. endchar;
  415.  
  416. cmchar "Character '151";
  417. larrow(105,3,-1);
  418. endchar;
  419.  
  420. cmchar "Character '161";
  421. rarrow(113,3,-1);
  422. endchar;
  423.  
  424. cmchar "Character '121";
  425. line(3,-2);
  426. endchar;
  427.  
  428. cmchar "Character '153";
  429. larrow(107,3,-2);
  430. endchar;
  431.  
  432. cmchar "Character '163";
  433. rarrow(115,3,-2);
  434. endchar;
  435.  
  436. cmchar "Character '123";
  437. line(3,-4);
  438. endchar;
  439.  
  440. cmchar "Character '157";
  441. larrow(111,3,-4);
  442. endchar;
  443.  
  444. cmchar "Character '167";
  445. rarrow(119,3,-4);
  446. endchar;
  447.  
  448. cmchar "Character '124";
  449. line(3,-5);
  450. endchar;
  451.  
  452. cmchar "Character '130";
  453. line(4,-1);
  454. endchar;
  455.  
  456. cmchar "Character '171";
  457. larrow(121,4,-1);
  458. endchar;
  459.  
  460. cmchar "Character '172";
  461. rarrow(122,4,-1);
  462. endchar;
  463.  
  464. cmchar "Character '132";
  465. line(4,-3);
  466. endchar;
  467.  
  468. cmchar "Character '175";
  469. larrow(125,4,-3);
  470. endchar;
  471.  
  472. cmchar "Character '176";
  473. rarrow(126,4,-3);
  474. endchar;
  475.  
  476. cmchar "Character '134";
  477. line(4,-5);
  478. endchar;
  479.  
  480. cmchar "Character '140";
  481. line(5,-1);
  482. endchar;
  483.  
  484. cmchar "Character '141";
  485. line(5,-2);
  486. endchar;
  487.  
  488. cmchar "Character '142";
  489. line(5,-3);
  490. endchar;
  491.  
  492. cmchar "Character '143";
  493. line(5,-4);
  494. endchar;
  495.  
  496. cmchar "Character '145";
  497. line(5,-6);
  498. endchar;
  499.  
  500. cmchar "Character '150";
  501. line(6,-1);
  502. endchar;
  503.  
  504. cmchar "Character '154";
  505. line(6,-5);
  506. endchar;
  507.  
  508. %%%Horizontal arrows:
  509.  
  510.  
  511. cmchar "Character '33";
  512. larrow(27,1,0);
  513. endchar;
  514.  
  515. cmchar "Character '55";  %right arrow
  516. beginchar(45,qqw#,qqw#,0pt#);
  517. x0=w; y0=0;
  518. x1=x0-arrowlen; y1=0;
  519. x2=x1; y2=arrowht;
  520. x3=x1; y3=-y2;
  521. x4=.5[x0,x1]; y4=.5y2-arrowcurve;
  522. x5=x4; y5=-y4;
  523. fill z0..z4..z2--z1--z3..z5..z0--cycle;
  524. endchar;
  525.  
  526. %%%vertical arrows
  527.  
  528.  
  529. cmchar "Character '66";  %up arrow
  530. beginchar(54,qqw#,qqw#,0pt#);
  531. x0=0; y0=w;
  532. y1=y0-arrowlen; x1=0;
  533. y2=y1; x2=arrowht;
  534. y3=y1; x3=-x2;
  535. y4=.5[y0,y1]; x4=.5x2-arrowcurve;
  536. y5=y4; x5=-x4;
  537. fill z0..z4..z2--z1--z3..z5..z0--cycle;
  538. endchar;
  539.  
  540.  
  541. cmchar "Character '77"; %down arrow
  542. beginchar(63,qqw#,qqw#,0pt#);
  543. x0=0; y0=0;
  544. y1=arrowlen; x1=0;
  545. y2=y1; x2=arrowht;
  546. y3=y1; x3=-x2;
  547. y4=.5y1; x4=.5x2-arrowcurve;
  548. y5=y4; x5=-x4;
  549. fill z0..z4..z2--z1--z3..z5..z0--cycle;
  550. endchar;
  551.  
  552. bye
  553.